package leetcode_ago.map_and_set;

/**
 * @author 美女
 * @date 2022/03/23 17:14
 **/

/**
 * 给你两个字符串数组待查表queries和词汇表words
 * 对于每次查询queries[i] ，需统计words中满足f(queries[i])< f(W)的词的数目，W表示词汇表words中的每个词。
 * 请你返回一个整数数组answer作为答案，其中每个answer[i]是第i次查询的结果
 */

import java.util.HashMap;
import java.util.Map;

/**
 * 分析：即queries中每个词都需要和words中全部单词比较，每个词的出现频次最小的单词的次数和words中每个单词最小单词出现次数比较
 * 统计小于words中单词的次数（每个queries统计一次）
 * 思路：
 * 1.map集合存储words中每个字符串的索引(key)以及对应的字符串中最小单词出现的频次（val）
 * 2.双层遍历，外部遍历queries这个字符串数组，内层遍历取map值
 *  .queries每次的字符串最小单词频次与val做比较，若小于val则统计一次次数，内层map遍历完将统计好的次数统计给数组
 * 3.找字符串中最小字符（小写英文字母）出现次数单独作为一个方法：
 *   1>可以先循环把最小单词找出来，再统计次数
 *   2>边找边统计次数
 */
public class Num1170_NumSmallerByFrequency {
    public  int[] numSmallerByFrequency(String[] queries, String[] words) {
        int[] res=new int[queries.length];
        Map<Integer,Integer> map=new HashMap<>();
        for (int i = 0; i < words.length; i++) {
            int count=findMin(words[i]);//当前字符串中最小字符出现次数
            map.put(i,count);
        }
        //此时words中内容全部在map集合中了,遍历queries字符串数组
        //外层循环遍历queries中每个字符串queries[i]
        for (int i = 0; i < queries.length ; i++) {
            //内层循环再次遍历map集合进行频次比较
            int q=findMin(queries[i]);//计算出queries[i]中频次
            int num=0;//记录queries...<words...的频次
            for(int key:map.keySet()){//map.keySet():获取key值
                if(q<map.get(key)){
                    num++;
                }
            }
            res[i]=num;
        }
        return res;
    }

    /**
     *  2>边找最小单词边统计次数
     */
    private  int findMin(String str){
        char[] array=str.toCharArray();
        char ch=array[0];
        int count=1;
        for (int i = 1; i < array.length; i++) {
            if(array[i]==ch){
                count++;
            }else if(array[i]<ch){
                //i索引位置值小
                ch=array[i];
                count=1;
            }//i大索引处值大不做处理直接向后遍历
        }
        return count;
    }
    /**
     * 1>可以先循环把最小单词找出来，再统计次数
     */
//    private  int findMin(String str) {
////        char ch=str.charAt(0);//获取第一个字母
////        for (int i = 1; i < str.length(); i++) {//遍历找到最小字母
////            if(str.charAt(i)<ch){
////                ch=str.charAt(i);
////            }
////        }
//        /**
//         * 可以按上面写，但最好直接转化为字符数组，用起来方便
//         */
//        char[] array=str.toCharArray();//字符串转化为数组
//        char ch=array[0];
//        for (int i = 1; i < array.length; i++) {//遍历找到最小字符
//            if(array[i]<ch){
//                ch=array[i];
//            }
//        }
//        //走到这ch是最小字母，再次遍历统计最小字母的次数
//        int count=0;
//        for (char i :array) {
//            if(i==ch){
//                count++;
//            }
//        }
//        return count;
//    }
}
